#include "product_manage.h" //

void Vector_Upd_switch(void *dast, size_t n)
{

    elem_type *p = (elem_type *)dast;

    void *data = (void *)calloc(1, sizeof(elem_type));
    printf("\n请输入新的%s：", product_gfind_v[n - 1]);

    scanf(product_gscanf_matrl[n - 1], data); // 数据放入堆区空间

    getchar();

    switch (n)
    {
    case 1:
        strcpy(p->_PRODUCT.ID, (char *)data);
        break;

    case 2:
        sprintf(p->_PRODUCT.name, "%s", (char *)data);
        break;

    case 3:
        p->_PRODUCT.cap = *(int *)data;

        break;

    case 4:
        p->_PRODUCT.size = *(int *)data;
        break;

    default:
        break;
    }

    free(data);
}

// 管理员才能使用
void product_Vector_Upd(vector v)
{
    int i = 0, j = 0;
    char YN_Del, c;
    char temp_ID[30] = "";
    union elem_vector **temp = NULL, **data_temp = NULL; // 二重指针存储是否需要修改的文件，批量删除测试

    printf("\n---------修改-----------\n");
    while (1)
    {
        data_temp = (union elem_vector **)realloc(data_temp, sizeof(union elem_vector *) * (j + 1));
        temp = (union elem_vector **)realloc(temp, sizeof(union elem_vector *) * (j + 1));
        data_temp[j] = (union elem_vector *)malloc(sizeof(union elem_vector));

        printf("请输入%s", product_gfind_v[0]);
        printf("\n::>");
        scanf("%s", temp_ID);
        YN_Del = getchar();

        if (NULL != (temp[j] = product_find_data(v, temp_ID, product_func_array[0], 1)))
        {
            i = 0;
            while (i < j)
            {
                if (temp[j] == temp[i]) // 遍历修改缓冲区的v->buff数据域的地址信息，如有赋值给再次针对性修改缓冲区信息
                {
                    temp[j] = data_temp[i];
                }
                i++;
            }
            *data_temp[j] = *temp[j];

            while (1)
            {
                system("clear");
                printf("该货物信息为:\n");
                product_show_inf(data_temp[j]);

                for (i = 0; i < PRODUCT_PROJECT_NUM; i++)
                {
                    printf("\n%d.修改%s", i + 1, product_gfind_v[i]);
                }

                printf("\n0.退出保存\n");
                printf("\nQ.返回上一级菜单\n");

                printf("\n:>");
                YN_Del = getchar();
                while ('\n' != YN_Del && '\n' != (c = getchar())) // 一个回车也会进入下一循环
                    ;

                if ('0' == YN_Del)
                {
                    break;
                }

                if ('Q' == YN_Del || 'q' == YN_Del)
                {
                    temp[j] = NULL;
                    free(data_temp[j]);
                    return;
                }

                if ('1' > YN_Del || (PRODUCT_PROJECT_NUM + '0') < YN_Del) // 如果不是这个选项区间就重新
                {
                    temp[j] = NULL;
                    free(data_temp[j]);

                    continue;
                }

                Vector_Upd_switch(data_temp[j], YN_Del - '0'); // 进入选择输入
            }
            j++;
        }
        else
        {
            printf("\nno find\n");
        }

        printf("\n确定退出？(Y/N)");

        YN_Del = getchar();
        while ('\n' != YN_Del && '\n' != (c = getchar())) // 一个回车也会进入下一循环
            ;

        if (YN_Del == 'Y' || YN_Del == 'y')
            break;
    }

    printf("是否保存操作？(Y/N)");

    YN_Del = getchar();
    while ('\n' != YN_Del && '\n' != (c = getchar())) // 一个回车也会进入下一循环
        ;

    if (YN_Del == 'Y' || YN_Del == 'y')
    {
        printf("更新数据中\n");
        while (j--) // 连续更改
        {
            *(union elem_vector *)product_find_data(v, temp[j], product_func_array[0], 1) = *(data_temp[j]);
            i = temp[j] - &(v->buff[0]);
            Upd_file_all(data_temp[j], PRODUCT_DATA_FILE, i * sizeof(union elem_vector), sizeof(union elem_vector));
        }

        // product_Update_data(v); // 保存并备份
        // sleep(1);
        printf("更新成功\n");
    }
    else
    {
        printf("未能保存\n");

        // sleep(1);
    }

    //
    // printf("更新备份数据");

    return;
}

// void Vector_Upd_switch(void *dast, size_t n)
// {

//     elem_type *p = (elem_type *)dast;

//     void *data = (void *)calloc(1, sizeof(data_type));
//     printf("\n请输入新的%s：", product_gfind_v[n - 1]);

//     scanf(product_gscanf_matrl[n - 1], data); // 数据放入堆区空间

//     getchar();

//     switch (n)
//     {
//     case 1:
//         strcpy(p->_PRODUCT.ID, data);
//         break;

//     case 2:
//         sprintf(p->_PRODUCT.name, "%s", (char *)data);
//         break;

//     case 3:
//         p->_PRODUCT.cap = *(int *)data;

//         break;

//     case 4:
//         p->_PRODUCT.size = *(int *)data;

//         break;

//     default:
//         break;
//     }

//     free(data);
// }

// // 管理员才能使用
// void Vector_Upd(vector v)
// {
//     int i = 0, j = 0;
//     char YN_Del, c;
//     char temp_ID[30] = "";
//     elem_type **temp = NULL, **data_temp = NULL; // 二重指针存储是否需要修改的文件，批量删除测试

//     printf("\n---------修改-----------\n");
//     while (1)
//     {
//         data_temp = (elem_type **)realloc(data_temp, sizeof(elem_type *) * (j + 1));
//         temp = (elem_type **)realloc(temp, sizeof(elem_type *) * (j + 1));
//         data_temp[j] = (elem_type *)malloc(sizeof(elem_type));

//         printf("请输入货物ID");
//         printf("\n:>");
//         scanf("%s", temp_ID);
//         YN_Del = getchar();

//         if (NULL != (temp[j] = find_data(v, temp_ID, product_func_array[0], 0)))
//         {
//             printf("该商品信息为:\n");
//             show_inf(temp[j]);

//             for (i = 0; i < PRODUCT_PROJECT_NUM; i++)
//             {
//                 printf("\n%d.修改%s", i + 1, product_gfind_v[i]);
//             }

//             *data_temp[j] = *temp[j];

//             printf("\n0.返回上一级菜单\n");
//             printf("\n退出(Q)\n");

//             printf("\n:>");
//             YN_Del = getchar();
//             while ('\n' != YN_Del && '\n' != (c = getchar())) // 一个回车也会进入下一循环
//                 ;

//             if ('Q' == YN_Del || 'q' == YN_Del)
//             {
//                 temp[j] = NULL;
//                 free(data_temp[j]);
//                 return;
//             }

//             if ('1' > YN_Del || (PRODUCT_PROJECT_NUM + '0') < YN_Del) // 如果不是这个选项区间就重新
//             {
//                 temp[j] = NULL;
//                 free(data_temp[j]);

//                 continue;
//             }

//             Vector_Upd_switch(data_temp[j], YN_Del - '0'); // 进入选择输入
//             j++;
//         }
//         else
//         {
//             printf("\nno find\n");
//         }

//         printf("\n是否继续？(Y/N)");

//         YN_Del = getchar();
//         while ('\n' != YN_Del && '\n' != (c = getchar())) // 一个回车也会进入下一循环
//             ;

//         if (YN_Del == 'N' || YN_Del == 'n')
//             break;
//     }

//     printf("是否保存操作？(Y/N)");

//     YN_Del = getchar();
//     while ('\n' != YN_Del && '\n' != (c = getchar())) // 一个回车也会进入下一循环
//         ;

//     if (YN_Del == 'Y' || YN_Del == 'y')
//     {
//         while (j--) // 连续更改
//         {
//             *(elem_type *)find_data(v, &temp[j]->ID[0], func_array[0], 1) = *data_temp[j];
//         }
//         printf("更新数据中\n");
//         Update_data(v); // 保存并备份
//                         // sleep(1);
//         printf("更新成功\n");
//     }
//     else
//     {
//         printf("未能保存\n");
//         // sleep(1);
//     }

//     //
//     // printf("更新备份数据");

//     return;
// }
